package Modelo.Participante;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import Util.ExcecaoInstanciaNaoEncontrada;

public class ParticipanteDao {
	
	private String telefonePessoa;
	private String nomePessoa;
	private String cpfPessoa;
	private String enderecoPessoa;
	private String emailPessoa;
	private Calendar dataNascPessoa;
	private long nInscricao;
	
	public ParticipanteDao() {
		super();
	}
	public Participante adicionarParticipante(Connection connection,Participante participante){
		/* Criar "queryString". 
		 * Interrogacoes serao os parametros passados ao objeto
		 * preparedStatement*/
		String queryString = "INSERT INTO Participante"
				+ " ( codEvento, nroEdicao, codPessoa,"
				+ " tipoOuvinte, tipoApresentador, tipoOrganizador)"
				+ " VALUES (?, ?, ?, ?, ?, ?)";
		//Objeto que ira enviar a querrystring ao banco de dados e 
		//criara as chaves primarias
		try (PreparedStatement preparedStatement = connection.prepareStatement(
				queryString, Statement.RETURN_GENERATED_KEYS)) {

			int i = 1;
			int insertedRows = 0;
			//Coloca os parametros na mesma ordem indicada na querrystring
			preparedStatement.setLong(i++, participante.getCodEvento());
			preparedStatement.setLong(i++, participante.getNroEdicao());
			preparedStatement.setLong(i++, participante.getCodPessoa());
			preparedStatement.setBoolean(i++, participante.isTipoOuvinte());
			preparedStatement.setBoolean(i++, participante.isTipoApresentador());
			preparedStatement.setBoolean(i++, participante.isTipoOrganizador());
			insertedRows = preparedStatement.executeUpdate(); //Executa o comando SQL

			if (insertedRows == 0) {
				throw new SQLException("Can not add row to table 'ParticipanteIntern'");
			}

			if (insertedRows > 1) {
				throw new SQLException("Duplicate row in table 'ParticipanteIntern'");
			}

			/* Pega a chave primaria. */
			ResultSet resultSet = preparedStatement.getGeneratedKeys();

			if (!resultSet.next()) {
				throw new SQLException(
						"JDBC driver did not return generated key.");
			}
			Long nroInscricao = new Long(resultSet.getLong(1)); 
			return new Participante(participante.getCodPessoa(), participante.getNomePessoa(), 
					participante.getCpfPessoa(),participante.getEnderecoPessoa(), 
					participante.getDataNascPessoa(), participante.getEmailPessoa(), 
					participante.getTelefonePessoa(), nroInscricao,
					participante.getCodEvento(), participante.getNroEdicao(), 
					participante.isTipoOuvinte(),participante.isTipoApresentador(), 
					participante.isTipoOrganizador());
			
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public Participante buscarParticipante(Connection connection, Long nroInscricao)
			throws ExcecaoInstanciaNaoEncontrada{
		
		
		String queryString = "SELECT codPessoa, codEvento, nroEdicao,"
				+ "tipoOuvinte, tipoApresentador, tipoOrganizador" +
				" FROM Participante WHERE nroInscricao = ?";
		
		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {

			int i = 1;
			preparedStatement.setLong(i++, nroInscricao);
			//Pega os Resultados da busca
			ResultSet resultSet = preparedStatement.executeQuery();

			if(!resultSet.next()){
				throw new ExcecaoInstanciaNaoEncontrada(nroInscricao, "Participante");

			}
			
			i = 1;
			Long codPessoa = resultSet.getLong(i++);
			Long codEvento = resultSet.getLong(i++);
			Long nroEdicao = resultSet.getLong(i++);
			Boolean tipoOuvinte = resultSet.getBoolean(i++);
			Boolean tipoApresentador = resultSet.getBoolean(i++);
			Boolean tipoOrganizador = resultSet.getBoolean(i++);
			return new Participante(nroInscricao, codPessoa, codEvento,
					nroEdicao, tipoOuvinte, tipoApresentador, tipoOrganizador);


		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	public void removerParticipante(Connection connection, long nroInscricao)
			throws ExcecaoInstanciaNaoEncontrada{
		String queryString = "DELETE FROM Participante WHERE nroInscricao = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
			int i = 1;
			preparedStatement.setLong(i++, nroInscricao);

			int removedRows = preparedStatement.executeUpdate();

			if(removedRows == 0){
				throw new ExcecaoInstanciaNaoEncontrada(nroInscricao, "Participante");
			}

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}
	public void updateParticipante(Connection connection, Participante participante) 
			throws ExcecaoInstanciaNaoEncontrada {

		int updateRows = 0;

		String queryString = "UPDATE Participante "
				+ "SET tipoOuvinte = ?, tipoApresentador = ?, tipoOrganizador = ?" 
				+ " WHERE nroInscricao = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)){
			int i = 1;
			preparedStatement.setBoolean(i++, participante.isTipoOuvinte());
			preparedStatement.setBoolean(i++, participante.isTipoApresentador());
			preparedStatement.setBoolean(i++, participante.isTipoOrganizador());
			preparedStatement.setLong(i++, participante.getNroInscricao());
			updateRows = preparedStatement.executeUpdate();

			if(updateRows == 0){
				throw new ExcecaoInstanciaNaoEncontrada(participante.getNroInscricao(), "Participante");
			}

			else if(updateRows > 1){
				throw new SQLException("Linha duplicada para o identificador = '" + "' "
						+ "na tabela 'Participante'");
			}


		} catch (SQLException e) {
			throw new RuntimeException(e);
		}


	}
	
	/*Listar dados de um participante*/
	public List<Participante> buscarParticipantePorNroInscricao(Connection connection, Long nroIncricao) {

		String queryString = "SELECT pe.nomePessoa, pe.cpfPessoa, pe.enderecoPessoa, "
				+ "pe.emailPessoa, pe.dataNascPessoa, pe.telefonePessoa "
				+ ", pe.codPessoa, pa.codEvento, pa.nroEdicao, pa.tipoOuvinte "
				+ ", pa.tipoApresentador, pa.tipoOrganizador, "
				+ "FROM Participante pa JOIN Pessoa pe ON pa.codPessoa = pe.codPessoa"
				+ " WHERE pa.nroInscricao = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
			int i = 1;
			preparedStatement.setLong(i++, nroIncricao);
			
			ResultSet resultSet = preparedStatement.executeQuery();
			List<Participante> participantes = new ArrayList<Participante>();

			while(resultSet.next()){
				i = 1;
				
				this.nomePessoa = resultSet.getString(i++);
				this.cpfPessoa = resultSet.getString(i++);
				this.enderecoPessoa = resultSet.getString(i++);
				this.emailPessoa = resultSet.getString(i++);

				this.dataNascPessoa.setTimeInMillis(resultSet.getTimestamp(i++).getTime());
				this.telefonePessoa = resultSet.getString(i++);
				Long codPessoa = resultSet.getLong(i++);
				Long nroInscricao = resultSet.getLong(i++);
				Long codEvento = resultSet.getLong(i++);
				Long nroEdicao = resultSet.getLong(i++);
				Boolean tipoOuvinte = resultSet.getBoolean(i++);
				Boolean tipoApresentador = resultSet.getBoolean(i++);
				Boolean tipoOrganizador = resultSet.getBoolean(i++);

				this.dataNascPessoa.setTimeInMillis((resultSet.getTimestamp(i++)).getTime());
				

				

				participantes.add(new Participante(nroInscricao, codPessoa, codEvento,
						nroEdicao, tipoOuvinte, tipoApresentador, tipoOrganizador));//o que fazer aqui?!?!?!?!
			}
			return participantes;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	
	/*Listar dados de um participante*/
	public List<Long> buscarParticipantePorNome(Connection connection, String nomeParticipante) {

		String queryString = "SELECT pa.nroInscricao FROM participante pa JOIN pessoa pe "
				+ "ON pa.codPessoa = pe.codPessoa "
				+ "WHERE pe.nomePessoa = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
			int i = 1;
			preparedStatement.setString(i++, nomeParticipante);
			
			ResultSet resultSet = preparedStatement.executeQuery();
			List<Long> nroInscricoes = new ArrayList<Long>();

			while(resultSet.next()){
				i = 1;
				
				Long nInscricao = resultSet.getLong(i++);
				
				nroInscricoes.add(new Long(nInscricao));
			}
			return nroInscricoes;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
}
